package com.xinchuang.util;

import cn.hutool.core.collection.CollectionUtil;
import com.google.common.collect.Lists;
import com.xinchuang.entity.targetSystem.system.TargetType;
import lombok.extern.slf4j.Slf4j;

import java.text.Collator;
import java.util.*;

/**
 * @ClassName AreaUtil
 * @Description: TODO(写一段描述的话)
 * @Author zhangxuan
 * @Date 2021-01-19 15:22
 * @Verion V1.0
 */
@Slf4j
public class AreaUtil {

    private static double EARTH_RADIUS = 6371.393;

    /**
     * 计算弧度
     *
     * @param d
     * @return
     */
    public static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 计算两经纬度点间的距离（米）
     *
     * @param lat1
     * @param lng1
     * @param lat2
     * @param lng2
     * @return
     */
    public static double getDistance(double lat1, double lng1, double lat2, double lng2) {
        double radLat1 = rad(lat1);
        double radLat2 = rad(lat2);
        double a = radLat1 - radLat2;
        double b = rad(lng1) - rad(lng2);

        double c = (radLat1 + radLat2) / 2;
        double d = EARTH_RADIUS * 1000 * Math.cos(c);
        //经度上的距离
        double e1 = Math.abs(b) * d;
        double e2 = EARTH_RADIUS * 1000 * Math.abs(a);
        //纬度上的距离
        double s = Math.sqrt(e1 * e1 + e2 * e2);

        return s;
    }

    /**
     * 计算子目标形状的弧度
     *
     * @param map
     * @return
     */
    public static List<Double> getPosition(Map<String, Object> map) {
        try {
            return Geometry.getRadianHeight(
                    Double.parseDouble(map.get("lon").toString()),
                    Double.parseDouble(map.get("lat").toString()),
                    Double.parseDouble(map.get("earthHeight").toString())
            );
//            String shape = map.get("shape").toString();
//            switch (shape) {
//                case "矩形":
//                    return Geometry.getRadianHeight(
//                            Double.parseDouble(map.get("lon").toString()),
//                            Double.parseDouble(map.get("lat").toString()),
//                            1.0);
//                case "圆形":
//                    return Geometry.getCirclePosition(Double.parseDouble(map.get("lon").toString()), Double.parseDouble(map.get("lat").toString()),
//                            Double.parseDouble(map.get("radius").toString()),Double.parseDouble(map.get("earthHeight").toString()));
//                case "环形":
//                    return Geometry.getRingPosition(Double.parseDouble(map.get("lon").toString()), Double.parseDouble(map.get("lat").toString()),
//                            Double.parseDouble(map.get("innerRadius").toString()), Double.parseDouble(map.get("outRadius").toString()), Double.parseDouble(map.get("earthHeight").toString()));
//                default:
//                    return Geometry.getRadianHeight(
//                            Double.parseDouble(map.get("lon").toString()),
//                            Double.parseDouble(map.get("lat").toString()),
//                            Double.parseDouble(map.get("earthHeight").toString())
//                    );
//            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return new ArrayList<>();
        }
    }

    /**
     * 初始化子目标所需参数
     *
     * @return
     */
    public static Map<String, Object> getSubResultMap() {
        Map<String, Object> map = new HashMap<>();
        map.put("subName", null);
        map.put("lon", null);
        map.put("lat", null);
        map.put("length", null);
        map.put("width", null);
        map.put("angle", null);
        map.put("radius", null);
        map.put("innerRadius", null);
        map.put("outRadius", null);
        map.put("height", null);
        map.put("position", null);
        return map;
    }

    /**
     * 初始化国家
     *
     * @return
     */
//    public Map<String, List<String>> getWorldCountry() {
//        String[] asian = {"中国", "蒙古", "朝鲜", "韩国", "日本", "菲律宾", "越南", "老挝", "柬埔寨", "缅甸", "泰国", "马来西亚",
//                "文莱", "新加坡", "印度尼西亚", "东帝汶", "尼泊尔", "不丹", "孟加拉国", "印度", "巴基斯坦", "斯里兰卡",
//                "马尔代夫", "哈萨克斯塔", "吉尔吉斯斯坦", "塔吉克斯坦", "乌兹别克斯坦", "土库曼斯坦", "阿富汗", "伊拉克", "伊朗",
//                "叙利亚", "约旦", "黎巴嫩", "以色列", "巴勒斯坦", "沙特阿拉伯", "巴林", "卡塔尔", "科威特", "阿拉伯联合酋长国",
//                "阿曼", "也门", "格鲁吉亚", "亚美尼亚", "阿塞拜疆", "土耳其", "塞浦路斯"};
//        String[] europe = {"芬兰", "瑞典", "挪威", "冰岛", "丹麦", "法罗群岛", "爱沙尼亚", "拉脱维亚", "立陶宛", "白俄罗斯",
//                "俄罗斯", "乌克兰", "摩尔多瓦", "波兰", "捷克", "斯洛伐克", "匈牙利", "德国", "奥地利", "瑞士", "列支敦士登",
//                "英国", "爱尔兰", "荷兰", "比利时", "卢森堡", "法国", "摩纳哥", "罗马尼亚", "保加利亚", "塞尔维亚", "马其顿",
//                "阿尔巴尼亚", "希腊", "斯洛文尼亚", "克罗地亚", "波斯尼亚", "墨塞哥维纳", "意大利", "梵蒂冈", "圣马力诺",
//                "马耳她", "西班牙", "葡萄牙", "安道尔"};
//        String[] africa = {"埃及", "利比亚", "苏丹", "突尼斯", "阿尔及利亚", "摩洛哥", "亚速尔群岛", "马德拉群岛", "埃塞俄比亚",
//                "厄立特里亚", "索马里", "吉布提", "肯尼亚", "坦桑尼亚", "乌干达", "卢旺达", "布隆迪", "塞舌尔", "乍得", "中非", "喀麦隆",
//                "赤道几内亚", "加蓬", "刚果共和国", "刚果民主共和国", "圣多美基普林西比", "毛里塔尼亚", "西撒哈拉", "塞内加尔", "冈比亚",
//                "马里", "布基纳法索", "几内亚", "几内亚比绍", "佛得角", "塞拉利昂", "利比里亚", "科特迪瓦", "加纳", "多哥", "贝宁", "尼日尔",
//                "赞比亚", "安哥拉", "津巴布韦", "马拉维", "莫桑比克", "博茨瓦纳", "纳米比亚", "南非", "斯威士兰", "莱索托",
//                "马达加斯加", "科摩罗", "毛里求斯"};
//        String[] oceania = {"澳大利亚", "新西兰", "巴布亚新几内亚", "所罗门群岛", "瓦努阿图", "密克罗尼西亚", "马绍尔群岛", "帕劳", "瑙鲁", "基里巴斯", "图瓦卢", "萨摩亚", "斐济群岛", "汤加", "库克群岛"};
//        String[] america = {"加拿大", "美国", "墨西哥", "危地马拉", "伯利兹", "萨尔瓦多", "洪都拉斯", "尼加拉瓜", "哥斯达黎加", "巴拿马", "巴哈马",
//                "古巴", "牙买加", "海地", "多米尼加共和国", "安提瓜与巴布达", "圣基茨与尼维斯", "多米尼克", "圣卢西亚", "圣文森特与格林纳丁斯", "格林纳达",
//                "巴巴多斯", "特立尼达与多巴哥", "哥伦比亚", "委内瑞拉", "圭亚那", "法属圭亚那", "苏里南", "厄瓜多尔", "秘鲁", "玻利维亚", "巴西", "智力", "阿根廷", "乌拉圭",
//                "巴拉圭"};
//        String[] world = {"亚洲&asian", "欧洲&europe", "非洲&africa", "大洋洲&oceania", "美洲&america"};
//        Map<String, List<String>> map = new HashMap<>();
//        map.put("world", Arrays.asList(world));
//        map.put("asian", Arrays.asList(asian));
//        map.put("europe", Arrays.asList(europe));
//        map.put("africa", Arrays.asList(africa));
//        map.put("oceania", Arrays.asList(oceania));
//        map.put("america", Arrays.asList(america));
//        return map;
//    }


    public static List<String> getContinent() {
        String[] world = {"亚洲", "欧洲", "美洲", "非洲", "大洋洲"};
        List<String> continent = Arrays.asList(world);
        return continent;
    }

    public static List<Map<String, Object>> getCountry(int type, List<TargetType> typeList) {
        Comparator cmp = Collator.getInstance(Locale.CHINA);
        List<Map<String, Object>> resultList = Lists.newArrayList();
        List<String> list;
        if (type == 0) {
            String[] countrys = {"中国", "蒙古", "朝鲜", "韩国", "日本", "菲律宾", "越南", "老挝", "柬埔寨", "缅甸", "泰国", "马来西亚",
                    "文莱", "新加坡", "印度尼西亚", "东帝汶", "尼泊尔", "不丹", "孟加拉国", "印度", "巴基斯坦", "斯里兰卡",
                    "马尔代夫", "哈萨克斯塔", "吉尔吉斯斯坦", "塔吉克斯坦", "乌兹别克斯坦", "土库曼斯坦", "阿富汗", "伊拉克", "伊朗",
                    "叙利亚", "约旦", "黎巴嫩", "以色列", "巴勒斯坦", "沙特阿拉伯", "巴林", "卡塔尔", "科威特", "阿拉伯联合酋长国",
                    "阿曼", "也门", "格鲁吉亚", "亚美尼亚", "阿塞拜疆", "土耳其", "塞浦路斯"};
            Arrays.sort(countrys, cmp);
            list = Arrays.asList(countrys);
        } else if (type == 1) {
            String[] europe = {"芬兰", "瑞典", "挪威", "冰岛", "丹麦", "法罗群岛", "爱沙尼亚", "拉脱维亚", "立陶宛", "白俄罗斯",
                    "俄罗斯", "乌克兰", "摩尔多瓦", "波兰", "捷克", "斯洛伐克", "匈牙利", "德国", "奥地利", "瑞士", "列支敦士登",
                    "英国", "爱尔兰", "荷兰", "比利时", "卢森堡", "法国", "摩纳哥", "罗马尼亚", "保加利亚", "塞尔维亚", "马其顿",
                    "阿尔巴尼亚", "希腊", "斯洛文尼亚", "克罗地亚", "波斯尼亚", "墨塞哥维纳", "意大利", "梵蒂冈", "圣马力诺",
                    "马耳她", "西班牙", "葡萄牙", "安道尔"};
            Arrays.sort(europe, cmp);
            list = Arrays.asList(europe);
        } else if (type == 2) {
            String[] america = {"加拿大", "美国", "墨西哥", "危地马拉", "伯利兹", "萨尔瓦多", "洪都拉斯", "尼加拉瓜", "哥斯达黎加", "巴拿马", "巴哈马",
                    "古巴", "牙买加", "海地", "多米尼加共和国", "安提瓜与巴布达", "圣基茨与尼维斯", "多米尼克", "圣卢西亚", "圣文森特与格林纳丁斯", "格林纳达",
                    "巴巴多斯", "特立尼达与多巴哥", "哥伦比亚", "委内瑞拉", "圭亚那", "法属圭亚那", "苏里南", "厄瓜多尔", "秘鲁", "玻利维亚", "巴西", "智力", "阿根廷", "乌拉圭",
                    "巴拉圭"};
            Arrays.sort(america, cmp);
            list = Arrays.asList(america);
        } else if (type == 3) {
            String[] africa = {"埃及", "利比亚", "苏丹", "突尼斯", "阿尔及利亚", "摩洛哥", "亚速尔群岛", "马德拉群岛", "埃塞俄比亚",
                    "厄立特里亚", "索马里", "吉布提", "肯尼亚", "坦桑尼亚", "乌干达", "卢旺达", "布隆迪", "塞舌尔", "乍得", "中非", "喀麦隆",
                    "赤道几内亚", "加蓬", "刚果共和国", "刚果民主共和国", "圣多美基普林西比", "毛里塔尼亚", "西撒哈拉", "塞内加尔", "冈比亚",
                    "马里", "布基纳法索", "几内亚", "几内亚比绍", "佛得角", "塞拉利昂", "利比里亚", "科特迪瓦", "加纳", "多哥", "贝宁", "尼日尔",
                    "赞比亚", "安哥拉", "津巴布韦", "马拉维", "莫桑比克", "博茨瓦纳", "纳米比亚", "南非", "斯威士兰", "莱索托",
                    "马达加斯加", "科摩罗", "毛里求斯"};
            Arrays.sort(africa, cmp);
            list = Arrays.asList(africa);
        } else {
            String[] oceania = {"澳大利亚", "新西兰", "巴布亚新几内亚", "所罗门群岛", "瓦努阿图", "密克罗尼西亚", "马绍尔群岛", "帕劳", "瑙鲁", "基里巴斯", "图瓦卢", "萨摩亚", "斐济群岛", "汤加", "库克群岛"};
            Arrays.sort(oceania, cmp);
            list = Arrays.asList(oceania);
        }
        //类型表
        List<Map<String, Object>> types = Lists.newArrayList();
        if (CollectionUtil.isNotEmpty(typeList)) {
            Map<String, Object> typeMap;
            for (TargetType targetType : typeList) {
                typeMap = new HashMap<>();
                typeMap.put("type", "2");
                typeMap.put("typeId", targetType.getTypeId());
                typeMap.put("typeName", targetType.getTypeName());
                typeMap.put("children", Lists.newArrayList());
                types.add(typeMap);
            }
        }
        Map<String, Object> map;
        for (String s : list) {
            map = new HashMap<>();
            map.put("type", "1");
            map.put("typeId", "-1");
            map.put("typeName", s);
            map.put("children", types);
            resultList.add(map);
        }
        return resultList;
    }

    public static List<Map<String, Object>> getCountryAll(List<TargetType> typeList) {
        List<Map<String, Object>> list = Lists.newArrayList();
        List<String> continent = getContinent();
        Map<String, Object> map;
        for (int i = 0; i < continent.size(); i++) {
            map = new HashMap<>();
            map.put("type", "0");
            map.put("typeId", "-1");
            map.put("typeName", continent.get(i));
            map.put("children",getCountry(i, typeList));
            list.add(map);
        }
        return list;
    }

    /**
     * 初始化目标类型
     *
     * @return
     */
    public List<String> getTargetType() {
        String[] strings = {"机场", "舰船", "港口", "洞窟", "电厂设施", "桥梁", "阵地", "建筑物"};
        return Arrays.asList(strings);
    }

}